/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic.grafos;

import logic.Jugador;

/**
 *
 * @author Jose Gabriel Rivera
 */
public class GrafoEventosBalon extends Grafo implements java.io.Serializable{

    private int[] posesion;
    private int[] tirosAPuerta;
    private int[] perdidaBalon;
    private int[] pasesRealizados;
    private int[] goles;
    private int[] autogoles;
    private Jugador[] local;
    private Jugador[] visitante;
    private int nroJugadores;
    
    private Nodo primerPase;
    
    public GrafoEventosBalon(Jugador[] local, Jugador[] visitante, String[] objetosCancha) {
        nroJugadores= local.length+visitante.length;
        //instancia el equipo local y el equpo vistante
         this.local = local;
         this.visitante=visitante;
         primerPase=null;
        //Instanciar arreglos de esrtadisticas
        posesion = new int[nroJugadores];
        tirosAPuerta = new int[nroJugadores];
        perdidaBalon = new int[nroJugadores];
        pasesRealizados = new int[nroJugadores];
        goles = new int[nroJugadores];
        autogoles = new int[nroJugadores];
        
        //Crear nodos en el grafo
        for(int i=0;i<local.length;i++)
            this.añadirNodo(""+local[i].getEquipo()+" "+local[i].getNroDorsal()+" "+local[i].getPosicionPreferida());
        for(int i=0;i<visitante.length;i++)
            this.añadirNodo(""+visitante[i].getEquipo()+" "+visitante[i].getNroDorsal()+" "+visitante[i].getPosicionPreferida()); 
        for(int i=0;i<objetosCancha.length;i++)
            this.añadirNodo(objetosCancha[i]);
        
    }
    public void setPrimero(String primerPase){
         this.primerPase= buscarNodo(primerPase);
    }
    
    public Nodo buscarNodo(String primerPase){
        Nodo aux=primero;
   
        while(((aux.getInfo().toString()).compareTo(primerPase))!=0){
            
            aux=aux.siguiente;
        }
    
        return aux;
    }
    
    /**
     * Retorna la posesion de jugadores 
     */    
    public int getPosesion_pos(int pos, int equipo){
        int[] arrayL = new int[local.length];
        int[] arrayV = new int[visitante.length];
        int i,tiempoTotal=0;
        for(i=0;i<posesion.length;i++){
            tiempoTotal+=posesion[i];
        }
        if (equipo==0){
            for(i=0; i < local.length; i++){
                arrayL[i] = ((posesion[i]*100)/tiempoTotal);
            }
            return arrayL[pos];
        }else{
            for(i=0; i < posesion.length-local.length; i++){
                arrayV[i] = ((posesion[i + local.length]*100)/tiempoTotal);
            }
            return arrayV[pos];
        }
    }  
  
    public int[] getPorcentajePorEquipo(){
        int[] arreglo=new int [2];
        int tiempoTotal=0,i,j,tiempoL=0,tiempoV=0;
      
        for(i=0;i<posesion.length;i++){
            tiempoTotal+=posesion[i];
        }
      
        for(i=0;i<local.length;i++){
            tiempoL+=posesion[i];
        }
        arreglo[0] = ((tiempoL*100)/tiempoTotal);
        
        for(i=local.length;i<posesion.length;i++){
            tiempoV+=posesion[i];
        }
        arreglo[1] = ((tiempoV*100)/tiempoTotal);
      
      return arreglo;
    }

    /**
     * Retorna la tirosAPuerta de jugadores 
     */
    public int getTirosAPuerta_pos(int pos, int equipo) {
        int[] arrayL = new int[local.length];
        int[] arrayV = new int[visitante.length];
        int i;
        if (equipo==0){
            for(i=0; i < local.length; i++){
                arrayL[i] = tirosAPuerta[i];
            }
            return arrayL[pos];
        }else{
            for(i=0; i < posesion.length-local.length; i++){
                arrayV[i] = tirosAPuerta[i + local.length];
            }
            return arrayV[pos];
        } 
    }

    /**
     * Retorna la perdidaBalon de jugadores 
     */
    public int getPerdidaBalon_pos(int pos, int equipo) {
        int[] arrayL = new int[local.length];
        int[] arrayV = new int[visitante.length];
        int i;
        if (equipo==0){
            for(i=0; i < local.length; i++){
                arrayL[i] = perdidaBalon[i];
            }
            return arrayL[pos];
        }else{
            for(i=0; i < posesion.length-local.length; i++){
                arrayV[i] = perdidaBalon[i + local.length];
            }
            return arrayV[pos];
        } 
    }

    /**
     * Retorna la pasesRealizados de jugadores 
     */
    public int getPasesRealizados_pos(int pos, int equipo) {
        int[] arrayL = new int[local.length];
        int[] arrayV = new int[visitante.length];
        int i;
        
        if (equipo==0){
            for(i=0; i < local.length; i++){
                arrayL[i] = pasesRealizados[i];
            }
            return arrayL[pos];
        }else{
            for(i=0; i < posesion.length-local.length; i++){
                arrayV[i] = pasesRealizados[i + local.length];
            }
            return arrayV[pos];
        }
    }

    /**
     * Retorna la goles de jugadores 
     */
    public int getGoles_pos(int pos, int equipo) {
        int[] arrayL = new int[local.length];
        int[] arrayV = new int[visitante.length];
        int i;
        if (equipo==0){
            for(i=0; i < local.length; i++){
                arrayL[i] = goles[i];
            }
            return arrayL[pos];
        }else{
            for(i=0; i < posesion.length-local.length; i++){
                arrayV[i] = goles[i + local.length];
            }
            return arrayV[pos];
        }
    }

    /**
     * Retorna la autogoles de jugadores 
     */
    public int getAutogoles_pos(int pos, int equipo) {
        int[] arrayL = new int[local.length];
        int[] arrayV = new int[visitante.length];
        int i;
        if (equipo==0){
            for(i=0; i < local.length; i++){
                arrayL[i] = autogoles[i];
            }
            return arrayL[pos];
        }else{
            for(i=0; i < posesion.length-local.length; i++){
                arrayV[i] = autogoles[i + local.length];
            }
            return arrayV[pos];
        }
    }
    
    public void recorrerGrafo(){
//        1. Resultado del partido.
//        2. Posesión de balón por jugador y equipo
//        4. Tiros a puerta por jugador y equipo.
//        5. Perdidas de balón jugador y equipo
//        6. Cantidad de pases por jugador y equipo.
//        7. Goles por jugador y equipo.
        
        posesion = new int[nroJugadores];
        tirosAPuerta = new int[nroJugadores];
        perdidaBalon = new int[nroJugadores];
        pasesRealizados = new int[nroJugadores];
        goles = new int[nroJugadores];
        autogoles = new int[nroJugadores];        
        
        Nodo aux;
        NodoAdyacencia auxad;
        int actualtiempo = 0;
        String informacion;
        String equipo1;
        String equipo2;
        String jugador1="";
        String jugador2="";
        String posicion="";
        
    
        //Para recorrer el grafo la segunda vez, desde 0.
        for(int i=0; i<local.length+visitante.length;i++ ){
        posesion [i]=0;
        tirosAPuerta [i]=0;
        perdidaBalon [i]=0;
        pasesRealizados [i]=0;
        goles [i]=0;
        autogoles [i]=0;
            
        }
        
       if( (aux=primerPase)==null){ 
           return;
       }      
       
        auxad=aux.getAdyacencias();
        
        
      
        while(true){    
          
            //Se toca la informacion de los grafos para hacer las comparaciones
            informacion= (String) aux.getInfo();
            equipo1= informacion.substring(0,1);
            //Si el primer nodo es una equipo entonces toma la informacion de su jugador
            //y asigna el segundo de una ves  
            if((equipo1.equals("0") || equipo1.equals("1"))){ 
                jugador1=informacion.substring(2,4);
                informacion=(String) auxad.info.getInfo();
                equipo2= informacion.substring(0,1);

                //Si el nodo que recibe es un equipo aasigna la informacion de su judador
                //si no entonce toma la informacion completa del nodo que recibe la accion  
                if((equipo2.equals("0") || equipo2.equals("1"))){
                    jugador2=informacion.substring(2,4);
                    posicion=informacion.substring(5,8);
                }else{
                    equipo2=informacion;
                }


                //Si el primer nodo no es equipo entonces toma la informacion completa
                //y asigna el segundo de una ves  
            }else{
                equipo1=informacion;
                informacion=(String) auxad.info.getInfo();
                equipo2= informacion.substring(0,1); 
                
                //Si el nodo que recibe es un equipo aasigna la informacion de su judador
                //si no entonce toma la informacion completa del nodo que recibe la accion  
                if((equipo2.equals("0") || equipo2.equals("1"))){
                    jugador2=informacion.substring(2,4);
                }else{
                    equipo2=informacion;
                }
            }    


            //Verifica si la interaccion es entre el mismo equipo  
            if(equipo1.equals(equipo2)){          
              
               
                //Si es el equipo local entonces calcula posesion y los pases realizados del jugador   
                if(equipo1.equals("0")){
                    posesion[this.getJugador(jugador1, equipo1)]+= auxad.peso-actualtiempo;
                    pasesRealizados[this.getJugador(jugador1, equipo1)]++;

                    //Si es el equipo visitante entonces calcula posesion y los pases realizados del jugador
                }else{
                    posesion[local.length+this.getJugador(jugador1, equipo1)]+= auxad.peso-actualtiempo;
                    pasesRealizados[local.length+this.getJugador(jugador1, equipo1)]++;
                }

                    
            }else{ 

                    //Si el equipo regala un pase al otro equipo entonces calcula posesion y la perdida de posesion     
                    if((equipo1.equals("0")&& equipo2.equals("1")) ||(equipo1.equals("1")&& equipo2.equals("0")) ){ 
                        
                        if(equipo1.equals("0")){  
                           posesion[this.getJugador(jugador1, equipo1)]+= auxad.peso-actualtiempo;
                           perdidaBalon[this.getJugador(jugador1, equipo1)]++;
                              if (posicion.equals("POR")){
                                 tirosAPuerta[this.getJugador(jugador1, equipo1)]++;
                            }
                        }else{
                           posesion[local.length+this.getJugador(jugador1, equipo1)]+= auxad.peso-actualtiempo;
                           perdidaBalon[local.length+this.getJugador(jugador1, equipo1)]++;
                              if (posicion.equals("POR")){
                                 tirosAPuerta[local.length+this.getJugador(jugador1, equipo1)]++;
                              }
                        }
                    } 

                    //Si el equipo bota el balon entonces calcula posesion y la perdida de posesion   
                    if(equipo1.equals("0") && (equipo2.equals("Banda") ||equipo2.equals("Corner")) ){ 
                        posesion[this.getJugador(jugador1, equipo1)]= auxad.peso-actualtiempo;
                        perdidaBalon[this.getJugador(jugador1, equipo1)]++;
                    } 
                     if(equipo1.equals("1") && (equipo2.equals("Banda") ||equipo2.equals("Corner")) ){ 
                        posesion[this.getJugador(jugador1, equipo1)]= auxad.peso-actualtiempo;
                        perdidaBalon[local.length+this.getJugador(jugador1, equipo1)]++;
                    } 
                    //Calcula si hay gol o autogol
                    if(equipo1.equals("0") && equipo2.equals("Puerta Local") ){ 
                        posesion[this.getJugador(jugador1, equipo1)]+= auxad.peso-actualtiempo;
                        perdidaBalon[this.getJugador(jugador1, equipo1)]++;
                        autogoles[this.getJugador(jugador1, equipo1)]++;
                    }else{
                        if(equipo1.equals("1") && equipo2.equals("Puerta Local") ){ 
                            posesion[local.length+this.getJugador(jugador1, equipo1)]= auxad.peso-actualtiempo;
                            perdidaBalon[local.length+this.getJugador(jugador1, equipo1)]++;
                            goles[local.length+this.getJugador(jugador1, equipo1)]++;
                        }else{
                          if(equipo1.equals("1") && equipo2.equals("Puerta Visitante") ){ 
                             posesion[local.length+this.getJugador(jugador1, equipo1)]= auxad.peso-actualtiempo;
                             perdidaBalon[local.length+this.getJugador(jugador1, equipo1)]++;
                             autogoles[local.length+this.getJugador(jugador1, equipo1)]++; 
                        }else{
                              if(equipo1.equals("0") && equipo2.equals("Puerta Visitante") ){ 
                                  posesion[this.getJugador(jugador1, equipo1)]= auxad.peso-actualtiempo;
                                  perdidaBalon[this.getJugador(jugador1, equipo1)]++;
                                  goles[this.getJugador(jugador1, equipo1)]++;
                        
                               }
                         }

                         }
                       }       

        }
        actualtiempo=auxad.peso;
     
       aux=auxad.getInfo();
       auxad=aux.getAdyacencias();
               while(auxad!=null&& actualtiempo>=auxad.peso){
            auxad=auxad.getSiguiente();
        }
               
               
        if(auxad==null){
            return;
        }         
    }
        
    
        

    }        
    
    
    
    
    public int getJugador(String jugador, String equipo){
        if(equipo.equals("0")){
            for(int i=0; i<local.length;i++){
                if(jugador.equals(local[i].getNroDorsal())){
                    return i;
                }
             }
        }
        else{
            for(int i=0; i<=visitante.length;i++){
                if(jugador.equals(visitante[i].getNroDorsal())){
                    return i;
                }
             } 
        }
        return 0;
    }
    
    
    
    //Esta funcion es de prueba
    public void imprimirGrafo(){
        Nodo aux=this.primerPase;
        NodoAdyacencia auxA=aux.getAdyacencias();
        
        //Como es de prueba no esta validado nada a que si si quieren crear un grafo
        //No repitan un juador por que se va a quedar en un ciclo infinito jeje
       
            
       
           while(aux!=null && auxA!=null){
            aux=this.buscarNodo((String)(auxA.getInfo()).getInfo());
            auxA=aux.adyacencias;
           }
            
        }
    
    public void imprimirArrays(){
        int i=0;
         
        
       for(i=0;i< this.pasesRealizados.length;i++){
           System.out.println(pasesRealizados[i]+" Posocion del jugador"+ i);
       }
       System.out.println("Posesion");
       for(i=0;i< this.posesion.length;i++){
           System.out.println(posesion[i]+" Posicion del jugador"+ i);
       }
       
       System.out.println("Tiros a puerta");
       for(i=0;i< this.tirosAPuerta.length;i++){
           System.out.println(tirosAPuerta[i]+" Posocion del jugador"+ i);
       }
       
       System.out.println("Perodida de balon");
       for(i=0;i< this.perdidaBalon.length;i++){
           System.out.println(perdidaBalon[i]+" Posocion del jugador"+ i);
       }
       
       System.out.println("Goles");
       for(i=0;i< this.goles.length;i++){
           System.out.println(goles[i]+" Posocion del jugador"+ i);
    }
       
       System.out.println("Autogoles");
       for(i=0;i< this.autogoles.length;i++){
           System.out.println(autogoles[i]+" Posocion del jugador"+ i);
       }
    }
    
   /*Retorna los pases realizados por equipo*/
   public int[] getPasesRealzadosxEquipo(){
       int arreglo[]=new int[2];
       int i;
       
          for(i=0;i<local.length;i++){
          arreglo[0]+=pasesRealizados[i];
      }
      
      for(i=local.length;i<posesion.length;i++){
          arreglo[1]+=pasesRealizados[i];
      }
       return arreglo;
   }
   
   /**Retorna los tiros a puerta por equipo*/
   
   public int[] getTirosAPuertaxEquipo(){
       int[] arreglo=new int[2];
       int i,tirosL=0,tirosV=0;
       
     for(i=0;i<local.length;i++){
          arreglo[0]+=tirosAPuerta[i];
      }
      
      for(i=local.length;i<posesion.length;i++){
          arreglo[1]+=tirosAPuerta[i];
      }
       return arreglo;
   }
   
   /**REtorna los goles por equipo (arreglo de dos posicones) 0 local 1 visitante*/
   public int[] getGolesPorEquipo(){
         int[] arreglo=new int[2];
       int i;
       
     for(i=0;i<local.length;i++){
          arreglo[0]+=goles[i];
          arreglo[1]+=this.autogoles[i];
      }
      
      for(i=local.length;i<posesion.length;i++){
          arreglo[1]+=goles[i];
           arreglo[0]+=this.autogoles[i];
      }
       return arreglo;
   }
 
     /**Autogoles por equipo arreglo de dos posiciones*/
   public int[] getAutoGolesPorEquipo(){
         int[] arreglo=new int[2];
       int i;
       
     for(i=0;i<local.length;i++){
          arreglo[0]+=autogoles[i];
      }
      
      for(i=local.length;i<posesion.length;i++){
          arreglo[1]+=autogoles[i];
      }
       return arreglo;
   }
     
} 
    
    

